﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Infrastructure.Cache;
using Infrastructure.Extensions;
using Infrastructure.Model;

namespace Infrastructure.Helper
{
    /// <summary>
    /// 提供有关计算机信息的帮助方法，如 CPU 使用率、内存信息、系统运行时间等。
    /// </summary>
    public class ComputerHelper
    {
        /// <summary>
        /// 获取计算机的系统信息，包括总内存、内存使用率、CPU 使用率和系统运行时间。
        /// </summary>
        /// <returns>包含计算机信息的 ComputerInfo 对象。</returns>
        public static ComputerInfo GetComputerInfo()
        {
            ComputerInfo computerInfo = new ComputerInfo();
            try
            {
                // 创建内存指标客户端，获取内存使用情况
                MemoryMetricsClient memoryMetricsClient = new MemoryMetricsClient();
                MemoryMetrics metrics = memoryMetricsClient.GetMetrics();

                // 设置内存总量和内存使用率
                computerInfo.TotalRAM = Math.Ceiling(metrics.Total / 1024.0) + " GB";
                computerInfo.RAMRate = Math.Ceiling(100.0 * metrics.Used / metrics.Total) + " %";

                // 获取 CPU 使用率并设置
                computerInfo.CPURate = Math.Ceiling(GetCPURate().ParseToDouble()) + " %";

                // 获取系统运行时间并设置
                computerInfo.RunTime = GetRunTime();
            }
            catch (Exception)
            {
                // 异常处理部分可以记录日志或其他处理
            }
            return computerInfo;
        }

        /// <summary>
        /// 判断当前操作系统是否为 Unix 系统（包括 macOS 和 Linux）。
        /// </summary>
        /// <returns>如果是 Unix 系统，返回 true；否则返回 false。</returns>
        public static bool IsUnix()
        {
            return RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
        }

        /// <summary>
        /// 获取当前计算机的 CPU 使用率。
        /// </summary>
        /// <returns>返回 CPU 使用率的字符串表示。</returns>
        public static string GetCPURate()
        {
            string empty = string.Empty;
            if (IsUnix())
            {
                string text = ShellHelper.Bash("top -b -n1 | grep \"Cpu(s)\" | awk '{print $2 + $4}'");
                return text.Trim();
            }
            string text2 = ShellHelper.Cmd("wmic", "cpu get LoadPercentage");
            return text2.Replace("LoadPercentage", string.Empty).Trim();
        }

        /// <summary>
        /// 获取当前计算机的运行时间（自上次启动以来的时间）。
        /// </summary>
        /// <returns>返回计算机的运行时间（格式化的字符串）。</returns>
        public static string GetRunTime()
        {
            string result = string.Empty;
            try
            {
                // 如果是 Unix 系统，获取系统的启动时间
                if (IsUnix())
                {
                    string text = ShellHelper.Bash("uptime -s");
                    text = text.Trim();
                    result = DateTimeHelper.FormatTime((DateTime.Now - text.ParseToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ParseToLong());
                }
                else
                {
                    // 如果是 Windows 系统，使用 wmic 命令获取上次启动时间
                    string text2 = ShellHelper.Cmd("wmic", "OS get LastBootUpTime/Value");
                    string[] array = text2.Split('=', '\u0001');
                    if (array.Length == 2)
                    {
                        result = DateTimeHelper.FormatTime((DateTime.Now - array[1].Split('.')[0].ParseToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ParseToLong());
                    }
                }
            }
            catch (Exception)
            {
                // 异常处理部分可以记录日志或其他处理
            }
            return result;
        }
    }
}
